# -*- coding: utf-8 -*-
"""
Created on Sun Feb  3 01:23:03 2019
windows7
python3.6.3
Anaconda3->spyder
opencv3.4.5
代码参考《OpenCV3计算机视觉 Python语言实现》（第二版）
原程序运行后有一个bug，若是点击窗口的关闭键关闭Mywindow窗口，
就会陷入死循环，cv2.setMouseCallback('Mywindow',onMouse)就会失效，
在窗口内点左键也无法终止程序，一关窗口就马上弹出新窗口，无法停止程序。
估计Callback函数只对最初的Mywindow窗口起作用

因此新增：
try..except..finally
可以按ctrl+C强制终止程序
@author: Administrator
"""

import cv2
#import numpy as np

print(cv2.__version__)                    # 查看opencv的版本

clicked = False
def onMouse(event,x,y,flags,param):
    global clicked                        # 使用全局变量，允许直接修改全局变量clicked
    if event == cv2.EVENT_LBUTTONUP:      # 判断鼠标左键是否处于弹起（松开）的状态
        clicked = True

"""参数0表示打开摄像头，若要读取视频，则('视频地址.格式')，单引号不行就用双引号"""
cameraCapture = cv2.VideoCapture(0)       
cv2.namedWindow('Mywindow')               # 命名一个窗口
cv2.setMouseCallback('Mywindow',onMouse)  # 判断在Mywindow窗口内鼠标左键是否处于松开状态，类似单片机的定时器

print('Showing camera feed. Click the window or press any key to stop')

'''按帧读取视频'''
success,frame = cameraCapture.read()      # 能够正确读取success就是True,并且frame为每帧的图像（是一个三维矩阵）
'''and的优先级很低，可以不用括号，为了方便看，这里加上了括号'''

try:
    while success and (cv2.waitKey(1) == -1) and (not clicked): # cv2.waitKey(1)中1表示延时1ms，即每1ms刷新一次窗口
        
        cv2.imshow('Mywindow',frame)          # 在Mywindow窗口上显示从摄像头捕获的帧图像
        success,frame = cameraCapture.read()  # 继续捕获图像
        
except KeyboardInterrupt:
    print('user press ctrl+c, exit;')
finally:
    '''这里可以选择先释放再关闭窗口，或先关窗口再释放'''
    cameraCapture.release()                   # 释放摄像头
    cv2.destroyAllWindows()                   # 关闭所有窗口
#    cameraCapture.release()                   # 释放摄像头

    